#include "Candidato.h"
#include "Utils.h"
#include <sstream>

using namespace Entidades;

Candidato::Candidato() {
	this->lista = new Lista();
	this->votante = new Votante();
	this->cargo = new Cargo();
}

Cargo *Candidato::getCargo() const {
	return cargo;
}

Votante *Candidato::getVotante() const {
	return votante;
}

Lista *Candidato::getLista() const {
	return lista;
}

void Candidato::setCargo(string nombreDeCargo) {
	this->cargo->setNombre(nombreDeCargo);
}

void Candidato::setVotante(int DNI) {
	this->votante->setDNI(DNI);
}

void Candidato::setLista(int fecha, string cargo, string nombreDeLista) {
	this->lista->setEleccion(fecha, cargo);
	this->lista->setNombre(nombreDeLista);
}

void Candidato::hidratarse(char* buffer, unsigned int tamanioDelBuffer) {

	//escribo el buffer en el stringStream
	stringstream* ss = new stringstream(stringstream::in | stringstream::out | stringstream::binary);
	ss->seekg(0, ios::beg);
	ss->write(buffer, tamanioDelBuffer);

	//Lista (fecha int, Cargo -string cargoPrincipal-)
	unsigned int fechaDeLista;
	ss->read((char*) &(fechaDeLista), sizeof(int));
	this->lista->setEleccion(fechaDeLista, Utils::ObtenerSiguienteStringVariable(ss));
	this->lista->setNombre(Utils::ObtenerSiguienteStringVariable(ss));

	//Votante (string: dni)
	unsigned int dni;
	ss->read((char*) &(dni), sizeof(int));
	this->votante->setDNI(dni);

	//Cargo (nombre string)
	this->cargo->setNombre(Utils::ObtenerSiguienteStringVariable(ss));

	delete ss;
}

char* Candidato::construirBuffer() {
	//guarda: fecha int | cargoLista string | dniVotante int | cargoCandidato string

	//agrupo los atributos
	stringstream* ss = new stringstream(stringstream::in | stringstream::out | stringstream::binary);
	ss->seekp(0, ios::end);

	//fecha int
	unsigned int fecha = this->lista->getEleccion()->getFecha();
	ss->write((char*) &(fecha), sizeof(int));

	//cargoLista string
	unsigned int tamanioDelCargoLista = this->lista->getEleccion()->getCargo()->getNombre().size();
	ss->write((char*) &tamanioDelCargoLista, sizeof(int));
	ss->write(this->lista->getEleccion()->getCargo()->getNombre().c_str(), tamanioDelCargoLista);

	//nombreDeLaLista string
	unsigned int tamanioDelNombreDeLaLista = this->lista->getNombre().size();
	ss->write((char*) &tamanioDelNombreDeLaLista, sizeof(int));
	ss->write(this->lista->getNombre().c_str(), tamanioDelNombreDeLaLista);

	//DNI int
	unsigned int dniVotante = this->votante->getDNI();
	ss->write((char*) &(dniVotante), sizeof(int));

	//cargoCandidato string
	unsigned int tamanioDelCargoCandidato = this->cargo->getNombre().size();
	ss->write((char*) &tamanioDelCargoCandidato, sizeof(int));
	ss->write(this->cargo->getNombre().c_str(), tamanioDelCargoCandidato);

	//construyo el buffer
	unsigned int tamanioDelBuffer = this->getTamanioDelBuffer();
	char* buffer = new char[tamanioDelBuffer];
	ss->read(buffer, tamanioDelBuffer);
	delete ss;

	//lo devuelvo
	return buffer;
}

unsigned int Candidato::getTamanioDelBuffer() {
	return (5 * sizeof(int)) + this->lista->getEleccion()->getCargo()->getNombre().size() + this->lista->getNombre().size()
			+ this->cargo->getNombre().size();
}

void Candidato::marcarComoBorrado() {

}

Candidato::~Candidato() {
	delete this->lista;
	delete this->votante;
	delete this->cargo;
}

